package cn.com.anypay.manager.dto.wechat;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 微信访问令牌数据模型
 * 用于存储微信OAuth2.0认证过程中的访问令牌信息
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WeChatAccessToken {
    
    /**
     * 访问令牌
     */
    private String accessToken;
    
    /**
     * 过期时间（秒）
     */
    private Integer expiresIn;
    
    /**
     * 刷新令牌
     */
    private String refreshToken;
    
    /**
     * 用户OpenID
     */
    private String openId;
    
    /**
     * 授权作用域
     */
    private String scope;
    
    /**
     * UnionID（可选）
     */
    private String unionId;
    
    /**
     * 令牌创建时间
     */
    private LocalDateTime createTime;
    
    /**
     * 令牌过期时间
     */
    private LocalDateTime expireTime;
    
    /**
     * 检查访问令牌是否有效
     */
    public boolean isValid() {
        return accessToken != null && 
               !accessToken.trim().isEmpty() && 
               openId != null && 
               !openId.trim().isEmpty();
    }
    
    /**
     * 检查访问令牌是否已过期
     */
    public boolean isExpired() {
        if (expireTime == null) {
            return false;
        }
        return LocalDateTime.now().isAfter(expireTime);
    }
    
    /**
     * 设置过期时间（根据expiresIn计算）
     */
    public void calculateExpireTime() {
        if (expiresIn != null && expiresIn > 0) {
            this.createTime = LocalDateTime.now();
            this.expireTime = this.createTime.plusSeconds(expiresIn);
        }
    }
    
    /**
     * 获取剩余有效时间（秒）
     */
    public long getRemainingSeconds() {
        if (expireTime == null) {
            return 0;
        }
        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(expireTime)) {
            return 0;
        }
        return java.time.Duration.between(now, expireTime).getSeconds();
    }
}